package com.lin.utils;


import com.lin.entity.Menu;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: xg-parent
 * @description: 构建菜单树的类
 * @author: Mr.Nie
 * @create: 2022-02-16 11:33
 **/
public class MenuTreeBuilder {

    /**
     * 构建多级菜单树
     * @param rootMenu
     * @return
     */
    public static List<Menu> build(List<Menu> rootMenu){
        //直接在这里查是完全没问题的

        // 查看结果
        /*for (Menu menu : rootMenu) {
            System.out.println(menu);
        }*/
        // 存储最终的一个树形菜单
        List<Menu> menuList = new ArrayList<Menu>();
        // 先要查询父级菜单
        for (Menu menu : rootMenu) {
            if(menu.getParentId()==0){
                //添加到父级菜单
                menuList.add(menu);
            }
        }
        /* 根据Menu类的order排序 */
       Collections.sort(menuList,Menu.order());

        //需要给父级菜单设置子菜单
        for (Menu menu : menuList) {
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }
        return menuList;
    }

    private static List<Menu> getChild(Long id, List<Menu> rootMenu) {
        // 子菜单
        List<Menu> childList = new ArrayList<>();
        //这里是二级菜单
        for (Menu menu: rootMenu
        ) {
            //1.不是0 2.类型不是1 3.父级id必须要和传过来的父级id相等
            if(!menu.getParentId().equals("0")&&!menu.getType().equals("1")&&menu.getParentId().equals(id)){
                childList.add(menu);
            }
        }
        //对子集菜单进行排序
        Collections.sort(childList,Menu.order());
        //三级以及三级以上的菜单使用递归实现
        for (Menu menu : childList
        ) {
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }

        // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
}
